home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 July / Macworld (1999-07).dmg / Shareware World / Info / For Developers / Mops 3.4.sea / Quick Edit ƒ / Subject Glossary / Control Structures < prev    next >
Text File  |  1996-01-24  |  6KB  |  201 lines

  1. IF/THEN
  2.  
  3.  
  4. The stack notation for a conditional phrase flag is ?.  ? need not be a boolean
  5. as any non-zero number will be "true" for branching purposes (not to be confused
  6. with the boolean true which can only be -1).
  7.  
  8. : xxx    ( ? -- )    \ execute yyy if ? is non-zero
  9.     IF    yyy
  10.     THEN ;
  11.  
  12. : xxx    ( ? -- )    \ execute yyy if ? is non-zero, else execute zzz
  13.     IF        yyy
  14.     ELSE    zzz
  15.     THEN ;
  16.  
  17. : xxx    ( ? -- )    \ execute yyy if ? is zero
  18.     NIF    yyy
  19.     THEN ;
  20.  
  21. : xxx    ( ? -- )    \ execute yyy if ? is zero, else execute zzz
  22.     NIF        yyy
  23.     ELSE    zzz
  24.     THEN ;
  25.  
  26. Note that NIF will compile identically to 0= IF
  27.  
  28. ?exit  ( ? -- )    equivalent to  IF exit THEN
  29.  
  30. 0exit  ( ? -- )    equivalent to  0= IF exit THEN
  31.  
  32.  
  33. CASE/SELECT
  34.  
  35. CASE    --    Begins a CASE .. OF .. ENDOF  ... ENDCASE  structure.
  36. OF    n1 n2 --  | n1
  37.     Use within a CASE structure.  Yields n1 and jumps to beyond next ENDOF 
  38.     if no match.  
  39. ENDOF    --    Use in CASE structure.
  40. RANGEOF    val  lo hi --
  41.     Use in place of an OF in a CASE structure.  Provides conditional 
  42.     execution if val is within range lo to hi inclusive.  
  43. ENDCASE    n --    Marks end of CASE structure.
  44.  
  45.  
  46. : xxx    ( n -- )
  47.     CASE
  48.         n1        OF        ...        ENDOF
  49.         n2        OF        ...        ENDOF
  50.         n3        OF        ...        ENDOF
  51.         lo hi      RANGEOF    ...     ENDOF  \ do this if  lo ≤ n ≤ hi
  52.         ...                                \ default procedures
  53.     ENDCASE ;
  54.  
  55. IS{    240 index -- index here 240    Used in a select{ construct.
  56. SELECT{    --
  57.     defines a positional case construct - see Forth Dimensions vII p.51.  It 
  58.     is smaller and faster than the equivalent CASE construct, as long as 
  59.     there are more than a couple of values.  Values must be >= 0, and we 
  60.     give a warning if a value > 50 is used, which could well be a boo-boo.  
  61. DEFAULT{    --    Used in a select{ construct.
  62. }END    --    Used in a select{ construct.
  63. }SELECT    --    Used in a select{ construct.
  64.  
  65.  
  66. type{ mytype0 mytype1 mytype2 ... }  Used to define a contiguous set of
  67.     constants, starting with zero.  Convenient for use in SELECT{.
  68.  
  69.  
  70. : xxx    ( n -- )
  71.     SELECT{
  72.         mytype0 IS    ...    }END
  73.         mytype1 IS    ...    }END
  74.         mytype2 IS    ...    }END
  75.         DEFAULT{  ...
  76.     }SELECT ;
  77.  
  78. The advantage of SELECT{ over CASE is that it is faster.
  79.  
  80.  
  81. CASE[ is another keyed CASE.  Each test value or range is compiled into a 
  82. pair of 2-byte entries in a table.  Compilation is turned off and on while 
  83. getting the test values, which are evaluated at compile time.  This is slightly 
  84. less flexible than Eaker's CASE, but is faster and more compact.  It is also 
  85. adequate for the majority of keyed case needs.  When you want a positional 
  86. case, SELECT{ is still the best.  See file View for an example use.
  87.  
  88.  
  89. CASE[ 
  90. ]=>
  91. ],
  92. RANGE]=>
  93.  RANGE],
  94. DEFAULT=>
  95. ]CASE
  96.  
  97. example:
  98. : qq db
  99.     case[ 21 ]=> 210
  100.         [ 22 ]=> 220
  101.         [ 80 ], [ 82 ], [ 84 ], [ 86 ]=> 888
  102.         [ 30 40 range]=> 333
  103.         [ 90 ], [ 92 ], [ 170 ]=> -999
  104.         [ 90 ], [ 92 ], [ 100 150 range], [ 170 ]=> -999
  105.         [ 222 ]=>  2220
  106.       default=> 99
  107.      ]case  ;
  108.  
  109. : q db
  110.     select[    3 ]=> 23
  111.           [ 2 ]=> 22
  112. \          [ 0 ]=> 20
  113.           [ 8 ]=> 28
  114.     default=> 999
  115.     ]select  ;
  116.  
  117.  
  118.  
  119. DO/LOOP
  120.  
  121. BOUNDS    addr cnt -- limit addr
  122.     Equivalent to OVER + SWAP.  Useful for setting up many DO loops.
  123. DO    end beg --
  124.     Marks beginning of DO ...  LOOP sequence.  Will always execute at least 
  125.     once, even if end ≤ beg.  See ?DO.  DO loops are slightly different, 
  126.     although the change won't affect most existing code.  The loop is 
  127.     considered to be finished if the index crosses the boundary between the 
  128.     limit and the limit minus one, in either direction.  The main effect is 
  129.     to make loops go around one more time if the index is being counted 
  130.     down.  
  131. ?DO    end beg --
  132.     Marks beginning of ?DO ...  LOOP sequence.  Will not execute even once 
  133.     if end ≤ beg.  See DO.  
  134. LOOP    --    Marks end of DO ... LOOP structure.
  135. +LOOP    n --
  136.     Marks end of DO ...+LOOP structure.  Like LOOP except will increment i 
  137.     by n.  
  138. I    -- n
  139.     We keep the loop index I in D3, but the return stack is entirely in 
  140.     memory so that words can be called simply with BSR/JSR.  This means that 
  141.     I can be used in words called from within DO loops.  In fact I can be 
  142.     used as another local variable.  
  143. J    -- n    Index value for the next outer DO ... LOOP control structure.
  144. K    -- n    Index value for the 2nd outer DO ... LOOP control structure.
  145. UNLOOP    --
  146.     ANSI standard.  Use it if you want to EXIT from within a DO loop - put 
  147.     UNLOOP before the EXIT.  It removes the loop stuff from the return 
  148.     stack.  
  149. LEAVE    --
  150.     There is also a change to LEAVE, which is now a "leaping LEAVE".  When 
  151.     LEAVE is executed, it now causes the loop to be left immediately, rather 
  152.     than waiting until the next time LOOP is encountered.  
  153.  
  154. : xxx
  155.     ( end beg ) DO ... LOOP ;    \ i will increment by 1
  156.  
  157. : xxx
  158.     ( end beg ) DO ... ( incr) +LOOP ;    \ i will increment by incr
  159.  
  160.  
  161. : xxx
  162.     ( end beg ) DO    ...
  163.                     ( ? ) IF LEAVE THEN
  164.                     ...
  165.                 LOOP ;
  166.  
  167. FOR    limit --
  168.     Marks beginning of a FOR ...  NEXT loop.  These are simple loops that 
  169.     have less overhead than DO loops.  The loop index i counts down from 
  170.     limit-1 to zero.  The initial limit must be less than 64K.  Uses a DBRA 
  171.     loop instruction for speed.  You can't LEAVE a FOR ...  NEXT loop.  
  172. NEXT    --    Marks end of a FOR ... NEXT loop. See FOR.
  173.  
  174. : xxx  ( limit ) FOR  ...  NEXT ;  \  i is available
  175.  
  176. example:
  177. : go
  178.     4 FOR i . NEXT ;
  179. go
  180. 3 2 1 0  0->
  181.  
  182.  
  183.  
  184. BEGIN/AGAIN
  185.  
  186. BEGIN    --    standard.  Marks the beginning of a BEGIN ... (WHILE/NWHILE/UNTIL/NUNTIL/AGAIN) looping structure.
  187. AGAIN    --    Standard.  Marks bounds of BEGIN ... AGAIN loop.
  188. NUNTIL    ? --    Similar to until.  Stop if ? is-zero.
  189. NWHILE    ? --    Similar to while.  Continue if ? is zero.
  190. REPEAT    --    Standard.  Marks bounds of BEGIN ... XXX ... REPEAT loop.
  191. UNTIL    ? --    standard.  Stop if ? is non-zero.
  192. WHILE    ? --    standard.  Continue if ? is non-zero.
  193.  
  194.  
  195.  
  196. OTHER
  197.  
  198. EXIT    --
  199.     Terminates execution of the current word or method, and returns control 
  200.     to the next higher word on the return stack.  
  201.